package com.zjs.design;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * Jdk动态代理
 * 代理对象,不需要实现接口，但需要指定接口的类型
 * 代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象(需要我们指定创建代理对象/目标对象实现的接口的类型)
 * JDK代理,接口代理，必须提供接口
 * @author zhu_jinsheng
 * @version 1.0
 * @date 2020/7/4 17:55
 */
public class ProxyPatternOfJdkDynamicProxy {
    public static void main(String[] args) {
        Rent rent = new Landlord();
        Intermediary intermediary = new Intermediary(rent);
        Rent rentProxy = (Rent) Proxy.newProxyInstance(
                rent.getClass().getClassLoader(),
                rent.getClass().getInterfaces(),
                intermediary);
        rentProxy.rent();
    }
}

/**
 * 房子出租接口
 */
interface Rent {
    public void rent();
}

/**
 * 房东出租房子
 */
class Landlord implements Rent{

    @Override
    public void rent() {
        System.out.println("Jdk动态代理|房东要出租房子了！");
    }
}

/**
 * 中介代理
 */
class Intermediary implements InvocationHandler {

    private Object post;

    Intermediary(Object post){
        this.post = post;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        Object invoke = method.invoke(post, args);
        System.out.println("Jdk动态代理|中介：该房源已发布！");
        return invoke;
    }
}
